//
//  WBStatusListViewModel.swift
//  微博
//
//  Created by 康智桐 on 2018/4/14.
//  Copyright © 2018年 Kk. All rights reserved.
//

import Foundation
import SDWebImage




//上拉刷新最大尝试次数
let maxPullupTryTimes = 3

//微博数据列表视图模型

class WBStatusListViewModel {
    
    //微博视图模型数组懒加载
    lazy var statusList = [WBStatusViewModel]()
    
    //上拉刷新错误次数
    var pullupErrorTimes = 0

    
    func loadStatus(pullup:Bool ,completion : @escaping (_ isSuccess:Bool ,_ shouldRefresh:Bool)->())  {
        
        
        //判断是否是上拉刷新，同时检查刷新错误
        if pullup && pullupErrorTimes > maxPullupTryTimes{
            
            completion(true, false)
            
            return
            
        }
        
        
        //since_id下拉取出数组中第一条微博的id
        let since_id = pullup ? 0 : (statusList.first?.status.id ?? 0)
        
        //上拉刷新，取出数组最后一条微博的id
        let max_id = !pullup ? 0 : (statusList.last?.status.id ?? 0)
        
        
        //发起网络请求 加载数博数据
        WBNetworkManager.shared.statusList(since_id: since_id,max_id: max_id) { (list, isSuccess) in
            
            
            //判断网络请求是否成功
            if !isSuccess {
                //直接回调返回
                completion(false, false)
                
                return
                
            }
            
//            print("--------")
//            print(list)
//            print("--------")
//            print(NSArray.yy_modelArray(with: WBStatus.self, json: list ?? []))
//            print("------")
//            
            //字典转模型
            //定义结果可变数组
            var array = [WBStatusViewModel]()
            
            //遍历字典数组，字典转模型
            for dict in list ?? [] {
                
                //创建微博模型
                let status = WBStatus()
                
                //使用字典设置模型数值
                status.yy_modelSet(with: dict)
                
                //使用 微博 模型创建 微博视图 模型
                let viewModel = WBStatusViewModel(model: status)
                
                //添加到数组
                array.append(viewModel)
            
            }
        //    print(array)
      
            
            print("刷新到\(array.count)条新的微博！")
            //拼接数据
            if pullup {
                //上拉刷新，把结果拼接在数组末尾
                self.statusList += array
            }else {
                //下拉刷新，应该讲结果拼接在数组前面
                self.statusList = array + self.statusList

            }
            
            //判断上拉刷新的数据量
            if pullup && array.count == 0 {
                
                self.pullupErrorTimes += 1
                
                completion(isSuccess, false)
                
            }else{
                
                self.cacheSingleImage(list: array,finished: completion)
                //完成回调
                //completion(isSuccess , true)
            }
   
        }
    }
    
    //缓存本次下载微博数据数组中的单张图像
    
    func cacheSingleImage (list:[WBStatusViewModel],finished : @escaping (_ isSuccess:Bool ,_ shouldRefresh:Bool)->()){
        
        //调度组
        let group = DispatchGroup()
        
        
        
        
        
        
        
        
        
        //记录数据长度
        var length = 0
        
        
        //遍历数组，查找微博数据中有单张图像的，进行缓存
        
        for vm in list {
            
            if vm.picURLs?.count != 1{
                continue
            }
            
           guard let pic = vm.picURLs?[0].thumbnail_pic,
            let url = URL(string: pic)  else {
                continue
            }
            //print("要缓存的URL是\(url)")
            
            // 下载图像
            //下载完成后会自动保存在沙盒中，如果沙盒中已经存在，后续通过url加载图像都会加载本地沙盒图像 不会发起网络请求
            
            
            
            //A>入组
            group.enter()
            
            
            
            
            SDWebImageManager.shared().imageDownloader?.downloadImage(with: url, options: [], progress: nil, completed: { (image, _, _, _) in
                
                
                //将图像转换成二进制数据
                if let image = image,
                     let data = UIImagePNGRepresentation(image) {
                    
                    length += data.count
                    
                    
                    //图像缓存成功 更新配图视图的大小
                    vm.updataSingleImageSize(image: image)
                    
                }
                
                
                
                print("缓存的图像是\(image)长度\(length)")
                
                
                //B>出组
                group.leave()
            })
            
        }
        
        //C>监听调度组
        group.notify(queue: DispatchQueue.main){
            print("图像缓存完成\(length / 1024 )K")
            
            
            //执行闭包回调
            finished(true, true)
            
            
        }
        
        
        
    }
}
